import { fileURLToPath, URL } from 'node:url';
import { defineConfig, loadEnv } from 'vite';
import vue from '@vitejs/plugin-vue';
import { visualizer } from 'rollup-plugin-visualizer';

/**
 * Vite配置 - 性能优化版
 * 
 * 优化策略：
 * 1. 代码分割：按vendor、页面、组件分离
 * 2. Tree-shaking：自动移除未使用代码
 * 3. 压缩优化：使用terser压缩JS
 * 4. Chunk命名：便于缓存和调试
 * 5. Bundle分析：生成可视化报告
 */

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd());
  const isProduction = mode === 'production';

  return {
    plugins: [
      vue(),
      // Bundle分析插件（仅在构建时生成）
      isProduction && visualizer({
        filename: 'dist/stats.html',
        open: false,
        gzipSize: true,
        brotliSize: true,
      }),
    ].filter(Boolean),
    
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
      },
    },
    
    server: {
      port: 8080,
      host: '127.0.0.1',
      open: true,
      proxy: {
        '/api': {
          target: 'http://localhost:3000',
          changeOrigin: true,
          secure: false,
        },
      },
    },
    
    build: {
      target: 'es2015', // 兼容性与性能的平衡
      minify: 'terser', // 使用terser压缩
      cssMinify: true,
      
      // Terser压缩选项
      terserOptions: {
        compress: {
          drop_console: isProduction, // 生产环境移除console
          drop_debugger: isProduction, // 移除debugger
          pure_funcs: isProduction ? ['console.log', 'console.info'] : [],
        },
        format: {
          comments: false, // 移除注释
        },
      },
      
      // Chunk大小警告限制
      chunkSizeWarningLimit: 600,
      
      // 输出配置
      rollupOptions: {
        output: {
          // 优化的chunk分割策略
          manualChunks: (id) => {
            // Vue核心库
            if (id.includes('node_modules/vue') || 
                id.includes('node_modules/@vue') ||
                id.includes('node_modules/pinia')) {
              return 'vue-core';
            }
            
            // 路由库
            if (id.includes('node_modules/vue-router')) {
              return 'vue-router';
            }
            
            // UI图标库
            if (id.includes('node_modules/lucide-vue-next')) {
              return 'ui-icons';
            }
            
            // HTTP请求库
            if (id.includes('node_modules/axios')) {
              return 'http-client';
            }
            
            // 其他node_modules依赖
            if (id.includes('node_modules')) {
              return 'vendor';
            }
            
            // 性能工具单独分离
            if (id.includes('/utils/performance')) {
              return 'performance-utils';
            }
          },
          
          // 输出文件命名
          chunkFileNames: (chunkInfo) => {
            const facadeModuleId = chunkInfo.facadeModuleId;
            // 根据模块类型决定输出目录
            if (facadeModuleId && facadeModuleId.includes('/views/')) {
              return 'js/views/[name]-[hash].js';
            }
            if (facadeModuleId && facadeModuleId.includes('/components/')) {
              return 'js/components/[name]-[hash].js';
            }
            return 'js/[name]-[hash].js';
          },
          entryFileNames: 'js/[name]-[hash].js',
          assetFileNames: (assetInfo) => {
            // CSS文件
            if (assetInfo.name?.endsWith('.css')) {
              return 'css/[name]-[hash][extname]';
            }
            // 图片文件
            if (/\.(png|jpe?g|gif|svg|webp|avif)$/i.test(assetInfo.name || '')) {
              return 'images/[name]-[hash][extname]';
            }
            // 字体文件
            if (/\.(woff2?|eot|ttf|otf)$/i.test(assetInfo.name || '')) {
              return 'fonts/[name]-[hash][extname]';
            }
            // 其他资源
            return 'assets/[name]-[hash][extname]';
          },
        },
        
        // Tree-shaking优化
        treeshake: {
          moduleSideEffects: 'no-external',
        },
      },
      
      // 报告压缩后的大小
      reportCompressedSize: true,
      
      // 生成source map（开发环境）
      sourcemap: !isProduction,
    },
    
    // 依赖预构建优化
    optimizeDeps: {
      include: [
        'vue',
        'vue-router',
        'pinia',
        'axios',
        'lucide-vue-next',
      ],
      exclude: ['@vueuse/core'], // 排除按需导入的库
    },
    
    // 性能优化
    esbuild: {
      // 移除console和debugger（生产环境）
      drop: isProduction ? ['console', 'debugger'] : [],
    },
  };
});

